// controllers/audioPreprocessController.js
// 音频预处理控制器

const fs = require('fs');
const path = require('path');
const { exec } = require('child_process');
const util = require('util');
const execPromise = util.promisify(exec);

// FFmpeg路径（从环境变量或默认路径）
const FFMPEG_PATH = process.env.FFMPEG_PATH || 'ffmpeg';

/**
 * 预处理音频文件以提高识别准确率
 * @param {Buffer} audioBuffer - 原始音频数据
 * @param {string} inputFileExt - 输入文件扩展名
 */
async function preprocessAudio(audioBuffer, inputFileExt = '.webm') {
  try {
    // 创建临时文件
    const inputTempPath = path.join(__dirname, '../../temp', `input_${Date.now()}${inputFileExt}`);
    const outputTempPath = path.join(__dirname, '../../temp', `output_${Date.now()}.wav`);
    
    // 确保temp目录存在
    const tempDir = path.dirname(inputTempPath);
    if (!fs.existsSync(tempDir)) {
      fs.mkdirSync(tempDir, { recursive: true });
    }

    // 写入输入文件
    fs.writeFileSync(inputTempPath, audioBuffer);

    // 使用FFmpeg预处理音频
    // 参数说明:
    // - ar 16000: 设置采样率为16kHz（Whisper推荐）
    // - ac 1: 设置单声道
    // - af "highpass=200,lowpass=3000": 应用高通和低通滤波器去除噪声
    // - acodec pcm_s16le: 输出为16位PCM WAV格式
    const ffmpegCommand = `${FFMPEG_PATH} -i "${inputTempPath}" -ar 16000 -ac 1 -af "highpass=200,lowpass=3000" -acodec pcm_s16le "${outputTempPath}" -y`;
    
    console.log('执行FFmpeg命令:', ffmpegCommand);
    await execPromise(ffmpegCommand);

    // 读取处理后的音频数据
    const processedAudioBuffer = fs.readFileSync(outputTempPath);

    // 清理临时文件
    fs.unlinkSync(inputTempPath);
    fs.unlinkSync(outputTempPath);

    return processedAudioBuffer;
  } catch (error) {
    console.error('音频预处理失败:', error);
    throw new Error('音频预处理失败: ' + error.message);
  }
}

/**
 * 预处理并转录音频（主控制器方法）
 */
exports.preprocessAndTranscribe = async (req, res) => {
  if (!req.file) {
    return res.status(400).json({ msg: 'No audio file uploaded.' });
  }

  try {
    console.log('开始音频预处理...');
    
    // 预处理音频
    const processedAudioBuffer = await preprocessAudio(req.file.buffer, '.webm');
    
    console.log('音频预处理完成，大小:', processedAudioBuffer.length, '字节');
    
    // 这里应该将处理后的音频发送到Whisper服务
    // 为简化示例，我们直接返回成功消息
    res.json({ 
      result: '音频预处理完成，可以发送到Whisper进行识别',
      processed: true,
      originalSize: req.file.buffer.length,
      processedSize: processedAudioBuffer.length
    });
  } catch (error) {
    console.error('音频预处理错误:', error);
    res.status(500).send('音频预处理过程中出现错误: ' + error.message);
  }
};

// 导出辅助函数供其他模块使用
module.exports.preprocessAudio = preprocessAudio;